package com.szrt.day20170427.designmodel.demo04;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Random;

/**
 * 动态代理  类比
 * 
 * 动态代理：1 代理所有的类的所有方法
 * 
 * 2： 动态代理 jdk Proxy jdk的动态代理：  invoke  类加载器  interfaces  InvocationHandler 回调
 * @author zsrt
 *
 */
public class DynProxy {
	
	
	//目标对象
	private Object targetObject=null;
	
	
	
	public DynProxy(Object targetObject){
		this.targetObject = targetObject;
	}
	
	
	public Object getaab (){
		
		ClassLoader loader = targetObject.getClass().getClassLoader() ;
		Class<?>[] interfaces=targetObject.getClass().getInterfaces();
		
		
		//匿名内部类
		Object proxy  = Proxy.newProxyInstance(loader, interfaces, new InvocationHandler(){

			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				long begin = System.currentTimeMillis();
				System.out.println("记录开始时间...begin="+begin);
				
				
				//方法的调用 invoke是一个抽象方法
				//Object obj = method.
				
				Thread.currentThread().sleep(12);
				
				Object object = method.invoke(targetObject, args);
				
				long end = System.currentTimeMillis();
				System.out.println("记录结束时间..end="+end);
				return object;
			}
			
		});
		
		return proxy;
	}
	

}
